/*
 * Copyright (C) CETC15, Inc.
 * Author TangWen
 * Date 2013.5.27
 */

#ifndef THREAD_POOL_INTERFACE_H
#define THREAD_POOL_INTERFACE_H

#define EXPORT_SYMBOL

namespace THREAD_POOL{

//消息结构体
typedef struct QUEUEMSG
{
    char type;	
    unsigned long WPARAM;
    unsigned long LPARAM;
} QUEUEMSG;

//线程回调函数
typedef void (*MsgProc) (QUEUEMSG);

typedef struct POOLSTATUS
{
	int threadCount;		//线程池中的线程个数
	int busyCount;			//忙的线程个数，如果没有消息时还忙，检查回调函数MsgProc是否死锁或者死循环
	int idleCount;			//空闲线程个数，没有消息时应该为threadCount
	int waitMsgCount;		//在消息队列中等待处理的消息个数
	int discardMsgCount;	//一共丢弃的消息个数
} POOLSTATUS;

//如果需要以纯C接口提供，则还可以以句柄表示IThreadPool对象，再将成员函数转化为带有IThreadPool句柄的C函数
class IThreadPool
{
public:
	//往线程池中放消息，如果超过线程池消息队列的最大容量，返回false
	//prio从0开始，超过创建时指定的最大值-1，就会失败
	virtual bool PutMsg(QUEUEMSG msg, int prio) = 0;
	//获取线程池的工作状态
	virtual POOLSTATUS GetStatus() = 0;
	//虚拟析构函数，确保内存无泄漏
	virtual ~IThreadPool();
};

//ITimerTaskThreadPool线程回调函数
//参数1：原始消息
//参数2：还需要调用的次数，若一共需要调用无限次，则始终为-1
//参数3：一共需要调用的次数，-1为无限次
//返回值：1为继续回调，0为终止回调，这里提供一个机会给需要提前（在指定的回调次数未到前）终止回调的机会，尤其在无限次时有用
typedef int (*TimerMsgProc) (QUEUEMSG, int, int);

//如果需要以纯C接口提供，则还可以以句柄表示IThreadPool对象，再将成员函数转化为带有IThreadPool句柄的C函数
class ITimerTaskThreadPool
{
public:
	//往线程池中放消息，如果超过线程池消息队列的最大容量，返回false
	//interval以ms为单位，最小为10ms，callCount为调用次数，-1为不限次数
	virtual bool PutMsg(QUEUEMSG msg, int interval, int callCount, TimerMsgProc proc) = 0;
	//获取线程池的工作状态
	virtual POOLSTATUS GetStatus() = 0;
	//虚拟析构函数，确保内存无泄漏
	virtual ~ITimerTaskThreadPool();
};

};

using namespace THREAD_POOL;

extern "C"
{
//每个线程都有自己的队列，maxMsgCount是每个线程队列的长度
EXPORT_SYMBOL IThreadPool* CreateTraditionalPool(int threadCount, int maxMsgCount, MsgProc proc, int prioCount);
//所有的线程共用一个队列，maxMsgCount是线程池队列的长度
EXPORT_SYMBOL IThreadPool* CreateBankPool(int threadCount, int maxMsgCount, MsgProc proc, int prioCount);
//创建定时任务线程池
EXPORT_SYMBOL ITimerTaskThreadPool* CreateTimerTaskPool(int threadCount, int maxMsgCount);
//清除线程池对象，避免内存泄漏
EXPORT_SYMBOL void DeletePool(IThreadPool* pPool);
//清除定时触发线程池对象，避免内存泄漏
EXPORT_SYMBOL void DeleteTimerTaskPool(ITimerTaskThreadPool* pPool);
}

#endif
